package net.jgrm.common.db.utils;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

/**
 * 数据库操作工具类
 * 提供通用的数据库操作方法
 *
 * @author: houyong
 * @date: 2025年09月19日
 */
@Component
public class DatabaseUtils {

    private final JdbcTemplate jdbcTemplate;
    private final DataSource dataSource;

    @Autowired
    public DatabaseUtils(JdbcTemplate jdbcTemplate, DataSource dataSource) {
        this.jdbcTemplate = jdbcTemplate;
        this.dataSource = dataSource;
    }

    /**
     * 获取数据库连接
     *
     * @return 数据库连接对象
     * @throws SQLException SQL异常
     */
    public Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }

    /**
     * 执行查询操作，返回单条记录
     *
     * @param sql  SQL语句
     * @param args SQL参数
     * @return 查询结果映射
     */
    public Map<String, Object> queryForMap(String sql, Object... args) {
        return jdbcTemplate.queryForMap(sql, args);
    }

    /**
     * 执行查询操作，返回多条记录
     *
     * @param sql  SQL语句
     * @param args SQL参数
     * @return 查询结果列表
     */
    public List<Map<String, Object>> queryForList(String sql, Object... args) {
        return jdbcTemplate.queryForList(sql, args);
    }

    /**
     * 执行更新操作（INSERT、UPDATE、DELETE）
     *
     * @param sql  SQL语句
     * @param args SQL参数
     * @return 受影响的行数
     */
    @Transactional
    public int update(String sql, Object... args) {
        return jdbcTemplate.update(sql, args);
    }

    /**
     * 批量执行更新操作
     *
     * @param sql       SQL语句
     * @param batchArgs 批量参数
     * @return 受影响的行数数组
     */
    @Transactional
    public int[] batchUpdate(String sql, List<Object[]> batchArgs) {
        return jdbcTemplate.batchUpdate(sql, batchArgs);
    }

    /**
     * 检查表是否存在
     *
     * @param tableName 表名
     * @return 是否存在
     */
    public boolean tableExists(String tableName) {
        try {
            String sql = "SELECT count(*) FROM information_schema.tables WHERE table_name = ?";
            Integer count = jdbcTemplate.queryForObject(sql, Integer.class, tableName);
            return count != null && count > 0;
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 获取数据库当前时间
     *
     * @return 当前时间字符串
     */
    public String getCurrentDatabaseTime() {
        return jdbcTemplate.queryForObject("SELECT now()", String.class);
    }

    /**
     * 执行自定义的数据库操作
     *
     * @param action 数据库操作回调
     * @param <T>    返回类型
     * @return 操作结果
     * @throws Exception 操作异常
     */
    public <T> T executeWithConnection(ConnectionCallback<T> action) throws Exception {
        try (Connection connection = getConnection()) {
            return action.doInConnection(connection);
        }
    }

    /**
     * 数据库连接回调接口
     *
     * @param <T> 返回类型
     */
    @FunctionalInterface
    public interface ConnectionCallback<T> {
        T doInConnection(Connection connection) throws Exception;
    }
}